import numpy as np
import pandas as pd
from scipy.fftpack import fft,ifft
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']   #显示中文
mpl.rcParams['axes.unicode_minus']=False       #显示负号
from tqdm import tqdm
from pandas import Series
import math
import os

from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA

def data2fft(data):
    N = 4000
    fft_y = np.abs(fft(data))  # 数据转为fft
    fft_y = fft_y[0:N]  # 取fft中的前N个频率值
    fft_frequency = np.arange(N)  # 构造频率数据

    # 构造最大频率
    fft_y_reduce50 = fft_y[50:].tolist()  # 抛弃频率的前50行数据
    fft_y_max = max(fft_y_reduce50)  # 找出原频率数据中最大的幅值
    fft_frequency_max = fft_y_reduce50.index(max(fft_y_reduce50)) + 50  # 找出原频率数据中幅值最大对应的频率值

    # 构造基频-----------------------------------------------------------新增加的特征
    fft_y_base = fft_y[50:200].tolist()  # 选择频率的前50-200行数据
    fft_y_base_max = max(fft_y_base)  # 找出原频率数据中前50-200行最大的幅值
    fft_frequency_base_max = fft_y_base.index(max(fft_y_base)) + 50  # 找出频率数据中幅值最大对应的频率值

    # 构造基频的2倍频-----------------------------------------------------新增加的特征
    fft_y_base2 = fft_y[300:350].tolist()  # 选择频率的前300-350行数据
    fft_y_base2_max = max(fft_y_base2)  # 找出原频率数据中前300-350行最大的幅值
    fft_frequency_base2_max = fft_y_base2.index(max(fft_y_base2)) + 300  # 找出频率数据中幅值最大对应的频率值

    # 构造基频的3倍频-----------------------------------------------------新增加的特征
    fft_y_base3 = fft_y[400:500].tolist()  # 选择频率的前300-350行数据
    fft_y_base3_max = max(fft_y_base3)  # 找出原频率数据中前300-350行最大的幅值
    fft_frequency_base3_max = fft_y_base3.index(max(fft_y_base3)) + 400  # 找出频率数据中幅值最大对应的频率值

    # 构造200频率-----------------------------------------------------新增加的特征
    fft_y_base200 = fft_y[200:300].tolist()  # 选择频率的前200-300行数据
    fft_y_base200_max = max(fft_y_base200)  # 找出原频率数据中前200-300行最大的幅值
    fft_frequency_base200_max = fft_y_base200.index(max(fft_y_base200)) + 200  # 找出频率数据中幅值最大对应的频率

    # 构建低频是否存在异常频率-----------------------------------------------------新增加的特征
    fft_frequency_low_other = 0
    if fft_y_base_max < fft_y_base200_max:
        fft_frequency_low_other = 1

        # 构造倍频的比值-----------------------------------------------------新增加的特征
    ratio_base = 0
    ratio_base2 = 0
    ratio_base3 = 0
    a = abs((fft_frequency_max / fft_frequency_base_max) - round(fft_frequency_max / fft_frequency_base_max))
    b = abs(
        (fft_frequency_base2_max / fft_frequency_base_max) - round(fft_frequency_base2_max / fft_frequency_base_max))
    c = abs(
        (fft_frequency_base3_max / fft_frequency_base_max) - round(fft_frequency_base3_max / fft_frequency_base_max))
    if a > 0.06:
        ratio_base = 1
    if b > 0.06:
        ratio_base2 = 1
    if c > 0.06:
        ratio_base3 = 1

    return ratio_base, ratio_base2, ratio_base3

def oneFftData(train_data_fft):
    data_fft = {}
    columns = ["F_ai1", "F_ai2", "B_ai1", "B_ai2"]
    for i in columns:
        Fs = 51200  # 采样频率
        flag1 = 1000  # 数据起始位置
        flag2 = 1000 + Fs  # 数据结束位置
        train_data_fft = train_data_fft[flag1:flag2]

        ratio_base, ratio_base2, ratio_base3 = data2fft(train_data_fft[i])
        # --------------新增加的特征
        data_fft[i + "_ratio_base"] = ratio_base  # --------------新增加的特征
        data_fft[i + "_ratio_base2"] = ratio_base2  # --------------新增加的特征
        data_fft[i + "_ratio_base3"] = ratio_base3

    # 统计单个样本频率比值异常的数目--------------新增加的特征
    columns2 = ["B_ai2_ratio_base", "B_ai2_ratio_base2", "B_ai2_ratio_base3", "F_ai2_ratio_base", "F_ai2_ratio_base2",
                "F_ai2_ratio_base3"]
    sum_half = 0
    for j in columns2:
        if data_fft[j] == 1:
            sum_half += 1
    data_fft["ratio_half"] = sum_half

    # 统计单个样本频率比值异常的数目--------------新增加的特征
    columns3 = ["B_ai2_ratio_base", "B_ai2_ratio_base2", "B_ai2_ratio_base3", "F_ai2_ratio_base", "F_ai2_ratio_base2",
                "F_ai2_ratio_base3",
                "B_ai1_ratio_base", "B_ai1_ratio_base2", "B_ai1_ratio_base3", "F_ai1_ratio_base", "F_ai1_ratio_base2",
                "F_ai1_ratio_base3"]
    sum_all = 0
    for k in columns3:
        if data_fft[k] == 1:
            sum_all += 1
    data_fft["ratio_all"] = sum_all
    return data_fft

def fftDataFrame(dataPath):
    allFileNameList = []
    for root, dirs, files in os.walk(dataPath):
        allFileNameList = files
    fileNameList = []
    fileId = []
    for i in allFileNameList:
        if i[-5:-4] == "F":
            fileNameList.append(i)
            fileId.append(i[0:-6])

    datalist = []
    for name in tqdm(fileId):
        data_F = pd.read_csv(dataPath + name + "_F.csv")
        data_B = pd.read_csv(dataPath + name + "_B.csv")
        train_data = pd.DataFrame()
        train_data["F_ai1"] = data_F["ai1"]
        train_data["F_ai2"] = data_F["ai2"]
        train_data["B_ai1"] = data_B["ai1"]
        train_data["B_ai2"] = data_B["ai2"]
        train_data
        fftData = pd.DataFrame(oneFftData(train_data), index=[name])
        datalist.append(fftData)
    allFftData = pd.concat(datalist, axis=0)
    return allFftData

### 原始数据地址
ppath= "../../xuelangyun_d/Motor_tain/Positive/"
npath= "../../xuelangyun_d/Motor_tain/Negative/"
tpath= "../../xuelangyun_d/Motor_testP/"

fftDataP=fftDataFrame(ppath)
fftDataP.to_csv("fftDataP2.csv")
fftDataN=fftDataFrame(npath)
fftDataN.to_csv("fftDataN2.csv")
fftDataT=fftDataFrame(tpath)
fftDataT.to_csv("fftDataT2.csv")
trainfftData=pd.concat([fftDataP,fftDataN],axis=0)